import java.util.*;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        /* 1. 双端队列：ArrayDeque（官方推荐实现） */
        Deque<String> deque = new ArrayDeque<>();

        /* 2. 头尾插删查（返回特殊值版，推荐） */
        deque.offerFirst("A");   // 头插
        deque.offerLast("B");    // 尾插
        deque.offerFirst("C");
        System.out.println("初始deque: " + deque); // [C, A, B]

        System.out.println("peekFirst = " + deque.peekFirst()); // C（不删）
        System.out.println("peekLast  = " + deque.peekLast());  // B（不删）

        System.out.println("pollFirst = " + deque.pollFirst()); // C（删除）
        System.out.println("pollLast  = " + deque.pollLast());  // B（删除）
        System.out.println("剩余deque: " + deque); // [A]

        /* 3. 当栈用（LIFO）*/
        deque.push("X");   // 等效 addFirst
        deque.push("Y");
        System.out.println("pop = " + deque.pop()); // Y（等效 pollFirst）
        System.out.println("栈剩余: " + deque); // [X, A]

        /* 4. 抛异常版 API（失败时抛异常）*/
        deque.addFirst("P");
        deque.addLast("Q");
        System.out.println("getFirst = " + deque.getFirst()); // P
        System.out.println("getLast  = " + deque.getLast());  // Q

        /* 5. 一行流：List → 双端队列 */
        List<Integer> list = List.of(1, 2, 3);
        Deque<Integer> deqFromStream =
                list.stream().collect(Collectors.toCollection(ArrayDeque::new));
        System.out.println("Stream→Deque: " + deqFromStream); // [1, 2, 3]
    }
}

// | 操作 | 返回特殊值组（推荐）                | 抛异常组（失败抛异常）          | 等价栈方法     |
// | -- | ------------------------- | -------------------- | --------- |
// | 头插 | `boolean offerFirst(E e)` | `void addFirst(E e)` | `push(e)` |
// | 尾插 | `boolean offerLast(E e)`  | `void addLast(E e)`  | —         |
// | 头删 | `E pollFirst()`           | `E removeFirst()`    | `pop()`   |
// | 尾删 | `E pollLast()`            | `E removeLast()`     | —         |
// | 查头 | `E peekFirst()`           | `E getFirst()`       | `peek()`  |
// | 查尾 | `E peekLast()`            | `E getLast()`        | —         |
